package edu.zueb.sport.dao;

import edu.zueb.sport.entity.Equipment;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 体育器材的 MyBatis Mapper 接口，定义了对 equipment 表的操作方法。
 */
@Mapper
public interface EquipmentMapper {

    /**
     * 插入新的器材记录。
     *
     * @param equipment 要插入的器材对象
     * @return 插入的记录数
     */
    int insertEquipment(Equipment equipment);

    /**
     * 根据器材ID获取器材记录。
     *
     * @param equipmentId 器材ID
     * @return 对应的器材对象，如果不存在则返回 null
     */
    Equipment getEquipmentById(Long equipmentId);

    /**
     * 更新器材记录。
     *
     * @param equipment 要更新的器材对象
     * @return 更新的记录数
     */
    int updateEquipment(Equipment equipment);

    /**
     * 根据器材ID删除器材记录。
     *
     * @param equipmentId 器材ID
     * @return 删除的记录数
     */
    int deleteEquipment(Integer equipmentId);

    /**
     * 根据条件统计器材记录数。
     *
     * @param name 器材名称
     * @param equipmentTypeId 器材类型ID
     * @param brand 品牌
     * @param model 型号
     * @return 符合条件的器材记录数
     */
    int countByPage(
            @Param("name") String name,
            @Param("equipmentTypeId") Integer equipmentTypeId,
            @Param("brand") String brand,
            @Param("model") String model);

    /**
     * 根据条件分页查询器材记录。
     * 该方法支持根据器材名称、器材类型ID、品牌、型号进行筛选，并支持分页查询。
     *
     * @param name 器材名称，支持模糊查询
     * @param equipmentTypeId 器材类型ID，用于筛选特定类型的器材
     * @param brand 品牌，支持模糊查询
     * @param model 型号，支持模糊查询
     * @param pageNo 当前页码，从0开始
     * @param pageSize 每页大小，用于控制每页返回的器材数量
     * @return 返回符合条件的器材列表，若未找到则返回空列表
     */
    List<Equipment> listByPage(
            @Param("name") String name,
            @Param("equipmentTypeId") Integer equipmentTypeId,
            @Param("brand") String brand,
            @Param("model") String model,
            @Param("pageNo") int pageNo,
            @Param("pageSize") int pageSize);

    /**
     * 根据器材ID减少库存数量。
     *
     * @param equipmentId 器材ID，用于指定要减少库存的器材
     * @param borrowQuantity 借出数量，用于指定要减少的库存数量
     * @return 更新的记录数，如果更新成功则返回大于0的值，否则返回0
     */
    int subtractStockQuantity(
            @Param("equipmentId") Integer equipmentId, @Param("borrowQuantity") Integer borrowQuantity);
}
